/**
 * 战斗系统统一消息协议定义 (JavaScript版本)
 * 
 * 本文件定义了所有服务器间（Django后端、Node.js战斗服务器）和页面间（前端、Cocos客户端）的通讯数据格式。
 * 所有消息处理都应该遵循这里定义的格式，避免各处自作主张定义格式。
 * 
 * 与Python版本的message_protocol.py保持一致
 */

// 消息类型枚举
const MessageType = {
    // 基础通讯
    READY: "ready",                    // iframe准备就绪
    PING: "ping",                      // 心跳检测
    PONG: "pong",                      // 心跳响应
    
    // 命令相关
    COMMAND: "command",                // 游戏命令（纯转发）
    COMMAND_VALIDATED: "command_validated",  // 命令验证结果
    
    // 战斗管理（服务器只关心配置和结果）
    BATTLE_INIT: "battle_init",        // 战斗初始化（传递配置参数）
    BATTLE_END: "battle_end",          // 战斗结束（接收结果和统计）
    
    // 错误处理
    ERROR: "error"                     // 错误消息
};

// 回放控制动作枚举
const ReplayControlAction = {
    PLAY: "play",
    PAUSE: "pause",
    RESET: "reset",
    SEEK: "seek"  // 跳转到指定回合
};

/**
 * 消息协议工具类
 */
class MessageProtocol {
    /**
     * 创建命令消息
     * @param {string} commandId - 命令ID
     * @param {Object} commandData - 命令数据
     * @param {number} userId - 用户ID（可选）
     * @param {string} username - 用户名（可选）
     * @returns {Object} 命令消息对象
     */
    static createCommandMessage(commandId, commandData, userId = null, username = null) {
        const message = {
            type: MessageType.COMMAND,
            command_id: commandId,
            command_data: commandData
        };
        
        if (userId !== null) {
            message.user_id = userId;
        }
        if (username) {
            message.username = username;
        }
        
        return message;
    }
    

    
    /**
     * 创建命令验证结果消息
     * @param {string} commandId - 命令ID
     * @param {boolean} valid - 是否有效
     * @param {string} message - 验证消息
     * @returns {Object} 命令验证结果消息对象
     */
    static createCommandValidationMessage(commandId, valid, message) {
        return {
            type: MessageType.COMMAND_VALIDATED,
            command_id: commandId,
            valid: valid,
            message: message
        };
    }
    
    /**
     * 创建战斗状态消息
     * @param {string} messageType - 消息类型
     * @param {string} battleId - 战斗ID
     * @param {Object} stateData - 状态数据
     * @returns {Object} 战斗状态消息对象
     */
    static createBattleStateMessage(messageType, battleId, stateData) {
        return {
            type: messageType,
            battle_id: battleId,
            state_data: stateData
        };
    }
    

    
    /**
     * 创建错误消息
     * @param {string} errorCode - 错误代码
     * @param {string} errorMessage - 错误消息
     * @param {Object} details - 详细信息（可选）
     * @returns {Object} 错误消息对象
     */
    static createErrorMessage(errorCode, errorMessage, details = null) {
        const message = {
            type: MessageType.ERROR,
            error_code: errorCode,
            error_message: errorMessage
        };
        
        if (details) {
            message.details = details;
        }
        
        return message;
    }
}

// 常用消息格式示例
const EXAMPLE_MESSAGES = {
    command: {
        type: 'command',
        command_id: 'cmd_1234567890_abcdef',
        command_data: {
            // 原始命令数据，服务器不解析，直接转发
            action: 'move',
            unit_id: 'unit_123',
            target: { x: 10, y: 20 }
        },
        user_id: 1,
        username: 'player1'
    },

    battle_init: {
        type: 'battle_init',
        battle_id: 'battle_123',
        state_data: {
            // 战斗配置参数
            round_limit: 100,
            player1_info: { user_id: 1, username: 'player1' },
            player2_info: { user_id: 2, username: 'player2' },
            map_config: { width: 20, height: 20 }
        }
    },
    battle_end: {
        type: 'battle_end',
        battle_id: 'battle_123',
        state_data: {
            // 战斗结果和统计
            winner: 'player1',
            total_rounds: 45,
            end_reason: 'victory',
            statistics: {
                player1_units_killed: 5,
                player2_units_killed: 8
            }
        }
    }
};

// 导出模块
if (typeof module !== 'undefined' && module.exports) {
    // Node.js环境
    module.exports = {
        MessageType,
        ReplayControlAction,
        MessageProtocol,
        EXAMPLE_MESSAGES
    };
} else {
    // 浏览器环境
    window.MessageType = MessageType;
    window.ReplayControlAction = ReplayControlAction;
    window.MessageProtocol = MessageProtocol;
    window.EXAMPLE_MESSAGES = EXAMPLE_MESSAGES;
}